package frsf.cidisi.exercise.idemiatp.situationCalculus;

import frsf.cidisi.faia.agent.ActionFactory;
import frsf.cidisi.faia.agent.Perception;
import frsf.cidisi.faia.agent.situationcalculus.KnowledgeBase;
import frsf.cidisi.faia.agent.situationcalculus.SituationCalculusPerception;
import frsf.cidisi.faia.exceptions.PrologConnectorException;
import java.util.Hashtable;
import java.util.Vector;

public class StateArquelogo extends KnowledgeBase {

	Grafo mapa;
	int valor;
	float peso;
	String posicion;
	private Vector<String> ciudadesVisitadas;
	
    public StateArquelogo() throws PrologConnectorException {

		//TODO: Replace file name  
        //super("file.pl");
    	super("Archivo2.pl");
        this.initState();
    }

    @Override
    public ActionFactory getActionFactory() {
        return AgenteArqueologoActionFactory.getInstance();
    }

    @Override
    public String getSituationPredicate() {
        return "actualSituation";
    }

    @Override
    public String getBestActionPredicate() {
        return "bestAction";
    }

    @Override
    public String getExecutedActionPredicate() {
        return "action";
    }

    @Override
    public void updateState(Perception p) {
    	AgenteArqueologoPerception a = (AgenteArqueologoPerception) p;
    	this.mapa = a.getSatelite().clone();
    	this.actualizarMapaEnProlog();
        this.tell((SituationCalculusPerception) p);
    }

    private void actualizarMapaEnProlog() {
    	
    	for(Ciudad c : this.mapa.getCiudades()){
    		this.addKnowledge("tesoroEnCiudad(" + c.getNombre()+"," + c.getTesoro().peso + "," + c.getTesoro().valor + "," + this.getSituation() + ")");
    	}
    	
		
		
	}

	@Override
    public void initState() {
       
    	
    	this.mapa = new Grafo();
    	this.peso = 0;
    	this.posicion = "aragaey";
    	this.valor = 0;
    	
    	this.ciudadesVisitadas = new Vector<String>();
    	ciudadesVisitadas.add("aragaey");
		this.addKnowledge("posicionAgente(aragaey,0)");
		this.addKnowledge("pesoTesoroAgente(0,0)");
		this.addKnowledge("valorTesoroAgente(0,0)");
		
		
		/* se deberian setear, en el ambiente, los tesoros de cada ciudad en el archivo prolog, creo */
		
    }

    @Override
    public String toString() {
        String str = "Esta en --> " + this.getPosicion() + " Su tesoro pesa -->" + this.getPeso() + " Kilogramos y vale --> $" + this.getValor();
        
        return str;
    }
    
    /**
     * 
     * @return la ciudad en la que se encuentra actualmente el agente.
     */
    public String getPosicion(){
    	 String positionQuery = "posicionAgente(X," + this.getSituation() + ")";

         Hashtable[] result = this.query(positionQuery);

         return result[0].get("X").toString();
    }
    
    /**
     * 
     * @return el peso total de lo que va juntando de tesoro el agente.
     */
    @SuppressWarnings("unchecked")
	public float getPeso(){
    	String pesoQuery = "tesoroAgente(X,Y,"+this.getSituation()+")";
    	Hashtable[] r = this.query(pesoQuery);
    	
    	
    	this.peso = Float.parseFloat(r[0].get("X").toString()) + this.peso;
    	return this.peso;
    	
    }
    
    /**
     * 
     * @return el valor total de lo que va juntando de tesoro el agente.
     */
    public int getValor(){
    	String valorQuery = "tesoroAgente(X,Y,"+this.getSituation()+")";
    	Hashtable[] r = this.query(valorQuery);
    	
    	this.valor = Integer.parseInt(r[0].get("Y").toString()) + this.valor;
    	return this.valor;
    	
    }

	public Vector<String> getCiudadesVisitadas() {
		return this.ciudadesVisitadas; 
		
	}

	public void setPosicion(String posicion) {
		this.addKnowledge("posicionAgente(" + posicion + ","+this.getSituation()+")" );
		this.addKnowledge("visitada("+ this.posicion + ")");
		
	}

	public void setValor(int i) {
		this.valor = i;
		
	}

	public void setPeso(float f) {
		this.peso = f;
		
	}
    
}
